package com.soul.dubbo.api.mongo;

import com.soul.model.mongo.UserLike;
import com.soul.model.vo.PageResult;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboService;
import org.bson.types.ObjectId;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.util.CollectionUtils;

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * @author mdoya
 * @version 1.0
 * @description:
 */
@Slf4j
@DubboService
public class UserLikeApiImpl implements UserLikeApi {

    @Autowired
    private MongoTemplate mongoTemplate;

    @Autowired
    private FriendApi friendApi;

    /**
     * 探花 - 右滑 flag:true 喜欢 false:不喜欢
     *
     * @param userLike 佳人id
     * @return
     */
    @Override
    public Boolean love(UserLike userLike) {
        // 1. 查询当前用户之前喜欢数据
        long nowTime = System.currentTimeMillis();
        Query query = new Query();
        query.addCriteria(Criteria.where("userId").is(userLike.getUserId()).and("likeUserId").is(userLike.getLikeUserId()));
        UserLike userLike2 = mongoTemplate.findOne(query, UserLike.class);
        // 2. 更新数据
        if (userLike2 != null) {
            Query query2 = new Query();
            query2.addCriteria(Criteria.where("id").is(userLike2.getId()));
            Update update = new Update();
            update.set("isLike", userLike.getIsLike());
            update.set("updated", nowTime);
            mongoTemplate.updateFirst(query2, update, UserLike.class);
        } else { // 添加数据
            userLike.setCreated(nowTime);
            userLike.setUpdated(nowTime);
            mongoTemplate.insert(userLike);
        }
        // 3. 当前用户单向奔现
        if (userLike.getIsLike()) {
            // 4. 查询佳人是否也喜欢当前用户
            Query query3 = new Query();
            query3.addCriteria(Criteria.where("likeUserId").is(userLike.getUserId()).and("userId")
                    .is(userLike.getLikeUserId()).and("isLike").is(true));
            UserLike userLike3 = mongoTemplate.findOne(query3, UserLike.class);
            // 5. 双向奔现 添加为好友
            if (userLike3 != null) {
                friendApi.addContacts(userLike.getLikeUserId(), userLike.getUserId());
                return true;
            }
        }
        return false;
    }

    /**
     * 查询用户是否喜欢
     *
     * @param userId
     * @param visitorUserId
     * @return
     */
    @Override
    public UserLike findUserAlreadyLove(Long userId, Long visitorUserId) {
        Query query = new Query();
        query.addCriteria(Criteria.where("userId").is(userId).and("likeUserId").is(visitorUserId));
        return mongoTemplate.findOne(query, UserLike.class);
    }

    /**
     * 查询相互喜欢
     *
     * @param page
     * @param pagesize
     * @param currendUserId
     * @return
     */
    @Override
    public PageResult<UserLike> findUserAlreadyLovePage(Long page, Long pagesize, Long currendUserId,List<Long> userInfoIdsList) {
        // 1. userInfoIdsList集合条件查询结果为空
        if (CollectionUtils.isEmpty(userInfoIdsList)){
            // 1.1 查询当前用户喜欢的用户
            Query query = new Query();
            query.addCriteria(Criteria.where("userId").is(currendUserId).and("isLike").is(true));
            query.skip((page - 1) * pagesize).limit(pagesize.shortValue());
            List<UserLike> userLikeList = mongoTemplate.find(query, UserLike.class);
            // 1.2 没有喜欢的人
            if (CollectionUtils.isEmpty(userLikeList)){
                return null;
            }
            // 1.3 当前用户喜欢的用户ids
            List<Long> userLikeLikeUserIds = userLikeList.stream().map(UserLike::getLikeUserId).collect(Collectors.toList());
            return getUserLikePageResult(page, pagesize, currendUserId, userLikeLikeUserIds);
        }
        // 2. userInfoIdsList集合条件查询结果有值
        return getUserLikePageResult(page, pagesize, currendUserId, userInfoIdsList);
    }

    /**
     * 查询喜欢的人
     *
     * @param page
     * @param pagesize
     * @param currendUserId
     * @param userInfoIds
     * @return
     */
    @Override
    public PageResult<UserLike> findLikeUser(Long page, Long pagesize, Long currendUserId, List<Long> userInfoIds) {
        // 1. 条件查询结果为空
        Query query = new Query();
        if (CollectionUtils.isEmpty(userInfoIds)){
            // 1.1 查询喜欢的用户
            query.addCriteria(Criteria.where("userId").is(currendUserId).and("isLike").is(true));
            query.skip((page - 1) * pagesize).limit(pagesize.intValue());
            List<UserLike> userLikeList = mongoTemplate.find(query, UserLike.class);
            if (CollectionUtils.isEmpty(userLikeList)){
             return null;
            }
/*            // 1.2 剔除互相喜欢的用户ids
            List<Long> userLikeIds = userLikeList.stream().map(UserLike::getLikeUserId).collect(Collectors.toList());
            // 剔除相互喜欢  设置喜欢类型为false
            Map<ObjectId, UserLike> userLikeMap = userLikePageResultTomap(page, pagesize, currendUserId, userLikeIds);
            List<UserLike> userLikeList2 = new ArrayList<>();
            for (UserLike userLike : userLikeList) {
                if (userLikeMap != null){
                    UserLike u = userLikeMap.get(userLike.getId());
                    if (!userLike.getUserId().equals(u.getUserId()) && !userLike.getLikeUserId().equals(u.getLikeUserId())){
                        userLike.setIsLike(false);
                        UserLike userLike2 = new UserLike();
                        BeanUtils.copyProperties(userLike,userLike2);
                    }
                }
            }
            */
            return new PageResult<>(page,pagesize,Long.valueOf(userLikeList.size()),userLikeList);
        }
        // 2. 条件查询结果有值
        query.addCriteria(Criteria.where("userId").is(currendUserId).and("likeUserId").in(userInfoIds).and("isLike").is(true));
        List<UserLike> userLikeList2 = mongoTemplate.find(query, UserLike.class);
        if (CollectionUtils.isEmpty(userLikeList2)){
            return null;
        }

        return new PageResult<>(page,pagesize,Long.valueOf(userLikeList2.size()),userLikeList2);
    }

    /**
     * 互相喜欢 - 统计
     *
     * @param currendUserId
     * @return
     */
    @Override
    public Integer findEachLoveCount(Long currendUserId) {
        // 1. 查询当前用户喜欢
        Query query = new Query();
        query.addCriteria(Criteria.where("userId").is(currendUserId).and("isLike").is(true));
        List<UserLike> userLikeList = mongoTemplate.find(query, UserLike.class);
        if (CollectionUtils.isEmpty(userLikeList)){
            return 0;
        }
        // 2. 当前用户喜欢的用户ids
        List<Long> userLikeLikeUSerIds = userLikeList.stream().map(UserLike::getLikeUserId).collect(Collectors.toList());
        // 3. 查询当前用户关注的用户
        Query query2 = new Query();
        query2.addCriteria(Criteria.where("userId").is(currendUserId).and("likeUserId").in(userLikeLikeUSerIds).and("isLike").is(true));
        List<UserLike> userLikeList2 = mongoTemplate.find(query2, UserLike.class);
        if (CollectionUtils.isEmpty(userLikeList2)){
            return 0;
        }
        // 4. 查询被关注者关注用户
//        List<Long> userLikeUserIds = userLikeList2.stream().map(UserLike::getUserId).collect(Collectors.toList());
        Query query3 = new Query();
        query3.addCriteria(Criteria.where("userId").in(userLikeLikeUSerIds).and("likeUserId").is(currendUserId).and("isLike").is(true));
        List<UserLike> userLikeList3 = mongoTemplate.find(query3, UserLike.class);
        if (CollectionUtils.isEmpty(userLikeList3)){
            return 0;
        }
        // 5. 返回互相关注数量
        return userLikeList3.size();
    }

    /**
     * 喜欢 自己关注别人 - 统计
     *
     * @param currendUserId
     * @return
     */
    @Override
    public Integer findLoveCount(Long currendUserId) {
        Query query = new Query();
        query.addCriteria(Criteria.where("userId").is(currendUserId).and("isLike").is(true));
        Long count = mongoTemplate.count(query, UserLike.class);
        return count.intValue();
    }

    /**
     * 粉丝 别人关注 - 统计
     *
     * @param currendUserId
     * @return
     */
    @Override
    public Integer findFanCount(Long currendUserId) {
        Query query = new Query();
        query.addCriteria(Criteria.where("likeUserId").is(currendUserId).and("isLike").is(true));
        Long count = mongoTemplate.count(query, UserLike.class);
        return count.intValue();
    }

    /**
     * 查询粉丝和条件查询粉丝
     *
     * @param page
     * @param pagesize
     * @param currendUserId
     * @param infoIds
     * @return
     */
    @Override
    public PageResult<UserLike> findFanUserLike(Long page, Long pagesize, Long currendUserId, List<Long> infoIds) {
        // 1. 条件查询结果为空
        Query query = new Query();
        if (CollectionUtils.isEmpty(infoIds)){
            query.addCriteria(Criteria.where("likeUserId").is(currendUserId).and("isLike").is(true));
            query.skip((page - 1) * pagesize).limit(pagesize.intValue());
            List<UserLike> userLikeList = mongoTemplate.find(query, UserLike.class);
            if (CollectionUtils.isEmpty(userLikeList)){
                return null;
            }
            return new PageResult<>(page,pagesize,Long.valueOf(userLikeList.size()),userLikeList);
        }
        // 2. 条件查询结果有值
        query.addCriteria(Criteria.where("userId").in(infoIds).and("likeUserId").is(currendUserId).and("isLike").is(true));
        List<UserLike> userLikeList = mongoTemplate.find(query, UserLike.class);
        if (CollectionUtils.isEmpty(userLikeList)){
            return null;
        }
        return new PageResult<>(page,pagesize,Long.valueOf(userLikeList.size()),userLikeList);
    }

    /**
     *  相互喜欢转为map键值对
     * @param page
     * @param pagesize
     * @param currendUserId
     * @param userLikeIds
     * @return
     */
    private Map<ObjectId,UserLike> userLikePageResultTomap(Long page, Long pagesize, Long currendUserId, List<Long> userLikeIds) {
        PageResult<UserLike> userLikePageResult = getUserLikePageResult(page, pagesize, currendUserId, userLikeIds);
        return userLikePageResult.getItems().stream().collect(Collectors.toMap(UserLike::getId, userLike -> userLike));
    }

    /**
     *   查询看相互喜欢的公共方法
     * @param page
     * @param pagesize
     * @param currendUserId
     * @param userLikeLikeUserIds
     * @return
     */
    private PageResult<UserLike> getUserLikePageResult(Long page, Long pagesize, Long currendUserId, List<Long> userLikeLikeUserIds) {
        // 2. 有喜欢的人，看看对方是否也喜欢
        Query query2 = new Query();
        query2.addCriteria(Criteria.where("likeUserId").in(userLikeLikeUserIds).and("userId").is(currendUserId).and("isLike").is(true));
        List<UserLike> userLikeList2 = mongoTemplate.find(query2, UserLike.class);
        if (CollectionUtils.isEmpty(userLikeList2)){
            return null;
        }
        // 2.2 被喜欢的用户喜欢当前的用户ids
        List<Long> userLikeUserIds = userLikeList2.stream().map(UserLike::getUserId).collect(Collectors.toList());
        // 3. 相互喜欢
        Query query3 = new Query();
        query3.addCriteria(Criteria.where("likeUserId").in(userLikeUserIds).and("userId").in(userLikeLikeUserIds).and("isLike").is(true));
        List<UserLike> userLikeList3 = mongoTemplate.find(query3, UserLike.class);
        if (CollectionUtils.isEmpty(userLikeList3)){
            return null;
        }
        return new PageResult<>(page, pagesize,Long.valueOf(userLikeList2.size()),userLikeList3);
    }

}
